package br.com.arg.aplica.util;

// algoritmo http://www.geradorcnpj.com/algoritmo_do_cnpj.htm
public class CNPJ {

	public static String calculaDigitos(String strCnpj) {
		String cnpj = strCnpj.replaceAll("\\D", "");	// retira todos não digitos
		if (cnpj.length() < 14) {
			String base = "00000000000000";
			cnpj = base.substring(0, 14 - cnpj.length()) + cnpj;
		}

		int soma = 0,  dig = 0;
		String cnpjCalculado = cnpj.substring(0, 12);
		char[] chr_cnpj = cnpjCalculado.toCharArray();

// Primeiro digito
		for (int i = 0; i < 4; i++)
			if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9)
				soma += (chr_cnpj[i] - 48) * (6 - (i + 1));

		for (int i = 0; i < 8; i++)
			if (chr_cnpj[i + 4] - 48 >= 0 && chr_cnpj[i + 4] - 48 <= 9)
				soma += (chr_cnpj[i + 4] - 48) * (10 - (i + 1));

		dig = 11 - (soma % 11);
		cnpjCalculado += (dig == 10 || dig == 11) ? "0" : Integer.toString(dig);
		
// Segundo digito
		chr_cnpj = cnpjCalculado.toCharArray();
		soma = 0;
		for (int i = 0; i < 5; i++)
			if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9)
				soma += (chr_cnpj[i] - 48) * (7 - (i + 1));
		for (int i = 0; i < 8; i++)
			if (chr_cnpj[i + 5] - 48 >= 0 && chr_cnpj[i + 5] - 48 <= 9)
				soma += (chr_cnpj[i + 5] - 48) * (10 - (i + 1));
		dig = 11 - (soma % 11);
		cnpjCalculado += (dig == 10 || dig == 11) ? "0" : Integer.toString(dig);
		
		return cnpjCalculado;
	}

	public static boolean valida(String strCnpj) {

		String cnpj = strCnpj.replaceAll("\\D", "");

		if (cnpj.length() > 14) 
			return false;
		
		return cnpj.equals(calculaDigitos(cnpj));
	}

	
    public static String geraAleatorio() {  
        String nrCnpj = "";  
        Integer nr_random;  
        for (int i = 0; i < 8; i++) {  
        	nr_random = new Integer((int) (Math.random() * 10));  
            nrCnpj += nr_random.toString();  
        }  
        return calculaDigitos(nrCnpj+"/0001-00");  
    }  
	
	public static String toString(String strCnpj) {
		// máscara do CNPJ: 99.999.999.9999-99
		return (strCnpj.substring(0, 2) + "." + strCnpj.substring(2, 5) + "."
				+ strCnpj.substring(5, 8) + "." + strCnpj.substring(8, 12) + "-" + strCnpj
					.substring(12, 14));
	}
}
